package main

import "fmt"

func f1() (x int) {
	defer func(y int) {
		y++
		fmt.Println(y)
	}(x)
	return x
}

func f2() {
	err := recover()
	defer func() {
		if err != nil {
			fmt.Println("err:有错")
		}
	}()
	panic("错了")
}
func main() {

	// defer :
	// defer 语句会延迟函数的执行直到上层函数执行完毕。
	// Go 语言中的 defer 语句会将其后面跟随的语句进行延迟处理。
	// 在 defer 归属的函数即将返回时，将延迟处理的语句按 defer 定义的逆序进行执行 == > 类似递归
	// 也就是说，先被 defer 的语句最后被执行，最后被 defer 的语句，最先被执行。
	fmt.Println("开始")
	fmt.Println("1")
	fmt.Println("2")
	fmt.Println("3")
	fmt.Println("结束")

	fmt.Println("=========")
	fmt.Println("开始")
	defer fmt.Println("1")
	defer fmt.Println("2")
	defer fmt.Println("3")
	fmt.Println("结束")

	fmt.Println("=========")
	fmt.Println(f1())

	// panic / recover ==> panic 抛异常  recover 捕获异常
	f2()

}
